package bz.ziro.kanbe.dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

import org.slim3.datastore.Datastore;

import com.google.appengine.api.datastore.Key;

import bz.ziro.kanbe.meta.UserAgentMeta;
import bz.ziro.kanbe.model.UserAgent;
import bz.ziro.kanbe.util.KeyFactory;

/**
 * ユーザエージェント用DAO
 * @author Administrator
 */
public class UserAgentDao extends BaseDao<UserAgent> {

    //@SuppressWarnings("unused")
    private static final Logger logger = Logger.getLogger(UserAgentDao.class.getName());

    /**
     * モデルメタデータ
     */
    private static final UserAgentMeta agentMeta = new UserAgentMeta();

    /**
     * 単一検索
     * @param aKey
     * @return
     */
    public static UserAgent find(Long aKey) {
        Key key = KeyFactory.createAgentKey(aKey);
        return Datastore.query(agentMeta)
        		.filter(
        			agentMeta.key.equal(key)
        		).asSingle();
    }

    /**
     * 削除
     * @param aKey
     */
    public static void delete(Long aKey) {
        //対象を検索
        UserAgent agent = find(aKey);
        int priority = agent.getPriority();
        int leng = Datastore.query(agentMeta).count();

        //一番最後じゃない場合
        if ( priority != leng ) {
            //優先順位の上のものを検索
            List<UserAgent> agentList = findPriorityBetweenList(priority+1,leng);
            for ( UserAgent wkAgent : agentList ) {
                //優先順位を１追加
                int wkPriority = wkAgent.getPriority();
                int putPriority = wkPriority - 1;
                wkAgent.setPriority(putPriority);
            }
            //すべてを更新
            Datastore.put(agentList);
        }
        //対象を削除
        Datastore.delete(agent.getKey());
    }

    /**
     * 追加
     * @param aAgent
     */
    public static void insert(UserAgent aAgent) {
        //対象を検索
        int leng = Datastore.query(agentMeta).count();
        aAgent.setPriority(leng+1);
        //対象を削除
        Datastore.put(aAgent);
    }
    
    /**
     * 全件取得
     * @return
     */
    public static List<UserAgent> all() {
        //ページのデータを取得
        return  Datastore.query(agentMeta).asList();
    }

    /**
     * デフォルトのエージェントを取得
     * @return
     */
    public static UserAgent findDefaultAgent() {
        //空文字のエージェントを取得
        return  Datastore.query(agentMeta).filter(agentMeta.judge.equal(null)).asSingle();
    }

    /**
     * 優先順位の位置で取得
     * @param aLow
     * @param aUp
     * @return 優先順位順
     */
    public static List<UserAgent> findPriorityBetweenList(int aLow,int aUp) {
        return Datastore.query(agentMeta).
            	filter(
                 	agentMeta.priority.greaterThanOrEqual(aLow),
                 	agentMeta.priority.lessThanOrEqual(aUp)
            	).sort(agentMeta.priority.asc).asList();
    }
    /**
     * 優先順位の位置で取得
     * @param aLow
     * @param aUp
     * @return 優先順位順
     */
    public static List<UserAgent> findPriorityList() {
        return Datastore.query(agentMeta)
        		.sort(agentMeta.priority.desc).asList();
    }

    /**
     * 入れ替えを行う
     * @param start
     * @param target
     */
    public static void sortPriority(String aLine) {

        String[] csv = aLine.split(",");
        logger.info(aLine);
        List<UserAgent> agentList = findPriorityList();

        //違った場合
        if ( csv.length != agentList.size() ) {
            logger.warning("エージェントのソートがそーとーおかしい");
            return;
        }

        //どの順序になるべきかをマップに設定
        Map<Integer,Integer> sortMap = new HashMap<Integer,Integer>();
        for ( int cnt = 1; cnt <= csv.length; ++cnt ) {
            String buf = csv[cnt-1];
            Integer wkIdx = Integer.valueOf(buf);
            sortMap.put(wkIdx,csv.length - cnt + 1);
        }

        //エージェントリスト数回繰り返す
        for ( UserAgent agent : agentList ) {
            int newPriority = sortMap.get(agent.getPriority());
            //新規の順序を取得
            agent.setPriority(newPriority);
        }

        Datastore.put(agentList);
    }
}
